// 我们定义了一个接口 Person
interface Person {
  name: string;
  age: number;
}

interface IDuck {
  name: string;
  age: number;
}

// 接着定义了一个变量 viking，它的类型是 Person。这样，我们就约束了 viking 的形状必须和接口 Person 一致。
let viking: Person ={
  name: 'viking',
  age: 20
}

//有时我们希望不要完全匹配一个形状，那么可以用可选属性：
interface Person2 {
    name: string;
    age?: number;
}
let viking2: Person2 = {
    name: 'Viking'
}

//接下来还有只读属性，有时候我们希望对象中的一些字段只能在创建的时候被赋值，那么可以用 readonly 定义只读属性

interface Person3 {
  readonly id: number;
  name: string;
  age?: number;
}
let viking3: Person3

viking3.age = 9527

function getPersonName(person: Person){
  return person.name
}

let duck1: IDuck = {
  name:'duck',
  age: 20
}

let duck2: IDuck = {
  name:'duck2',
  age: 30
}

let duck3: IDuck = {
  name:'duck3',
  age: 40
}
// duck type
getPersonName(duck1)

interface IUserMap {
  [name: string]: IDuck
}

// 可索引类型
let userMap:IUserMap = {
  [duck1.name]: duck1,
  [duck2.name]: duck2,
  [duck3.name]: duck3,
}
